home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekikoh Dennoh Club 2
/
Gekikoh Dennoh Club Vol. 2 (Japan).7z
/
Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin
/
tools
/
post2_g2
/
src
/
p_kana.c
< prev
next >
Wrap
Text File
|
1997-10-13
|
16KB
|
641 lines
/*
post / 郵便番号検索プログラム
p_kana.c / カナ検索部
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/dos.h>
#include <mbstring.h>
#include "post.h"
/*
カナ検索メイン
*/
void
hankaku_kensaku()
{
int point[K_GEN], /* ofs 格納用 */
uchikiri = 0, /* 打ち切りビット(ないと思うけど) */
kensuu = 0, /* 検索ヒット件数 */
gen_page = 0, /* 現在のページ数 */
zen_page = 0, /* 全ページ数 */
kijun = 0, /* 表示用基準 */
ki = 0, /* 基準から算出した件数 */
aza_sw = 0, /* 字名スイッチ */
s_num = 0, /* 選択用 */
mainlp = 0, /* 表示ループ用 */
lp = 0, /* 表示ループ用(その2) */
lpcnt = 0, /* 表示ループ用(その2) */
shitei_ku_unkn = 0, /* 指定都市内の区名が不明スイッチ(長いねどうも) */
nextp = 0, /* オフセット保存用 */
slen = 0, /* 厳密検索用文字列長さ */
i1; /* ループ汎用 */
uchar joukyou[K_GEN], /* ヒット時のオフセット */
pnum[12][12], /* 郵便番号 */
pknum[12][8], /* 旧番号 */
numwork[12], /* 取りワーク */
numbuff[12], /* 入力用ワーク */
bdelim = '\0'; /* 直前のデリミタ */
uchar page_todou[12][10], /* ページ用の都道府県ワーク */
page_kugun[12][32], /* ページ用の市区郡ワーク */
page_tyouson[12][32], /* ページ用の市内区・町村ワーク */
page_azamei[12][512], /* ページ用の字名ワーク(50文字で打ち切り) */
page_yomi0[12][16], /* ページ用読み(都道府県) */
page_yomi1[12][32], /* ページ用読み(市区郡) */
page_yomi2[12][32], /* ページ用読み(市内区・町村) */
page_yomi3[12][512]; /* ページ用読み(字名) */
struct _inpptr inpp;
/* エラーは 6?? */
/* 読み検索 */
ofs = 0; /* 最初から */
kensuu = 0;
slen = strlen( input_str );
/* 小さいカナを大きいカナへ変換 */
for( i1=1; i1<=slen-2; i1++ ) { /* 最初と最後には小さい文字は出てこない(普通は) */
if( input_str[i1] == 0xaf ) {
input_str[i1] = 0xc2;
} else if( input_str[i1] == 0xac ) {
input_str[i1] = 0xd4;
} else if( input_str[i1] == 0xad ) {
input_str[i1] = 0xd5;
} else if( input_str[i1] == 0xae ) {
input_str[i1] = 0xd6;
}
}
/* とりあえず検索 */
do {
ofs = bm_find( '.', input_str, ofs );
if( ofs == -1 ) {
break;
}
if( kensuu == K_GEN ) { /* 件数 == K_GEN で検索打ち切り */
uchikiri = 1;
break;
}
/* 厳密検索 */
if( genmitsu_mode ) { /* 限定検索モードなら */
/* いま ofs は文字列の次のデリミタ位置にある */
if( is_not_delim( buf[ofs] ) ) { /* 直後がデリミタでない */
continue; /* ならば、途中で終わった */
}
if( is_not_delim( buf[ofs-slen-1] ) ) { /* 直前がデリミタでない */
continue; /* ならば、途中でヒットした */
}
}
/* ヒットしました */
nextp = ofs;
/* 読みデリミタの前のデリミタは何か */
pass_back_han( '+' );
ofs -= 2;
pass_back_han( '.' );
ofs--;
/* 字名限定の時は、字名以外は取らない */
if( azamei_gentei ) {
if( buf[ofs] != '%' ) {
ofs = nextp;
continue;
}
}
point[ kensuu ] = ofs; /* これはデリミタを指している */
joukyou[ kensuu ] = buf[ofs]; /* デリミタを取っておく */
kensuu++;
ofs = nextp;
} while( 1 );
if( kensuu != 0 ) { /* あった */
gen_page = 1; /* 1ページ目から */
if( kensuu % 12 == 0 ) {
zen_page = kensuu / 12;
} else {
zen_page = kensuu / 12 + 1;
}
if( zen_page == 0 ) {
zen_page = 1;
}
mainlp = 1;
do {
_dos_c_cls_al();
status_print();
printf("該当件数 : %4d 件",kensuu );
if( uchikiri ) { /* 検索を打ち切っていたら */
printf("(打切)");
} else {
printf("\t");
}
printf("\tページ : %2d / %2d\n", gen_page, zen_page);
/* 基準値 */
kijun = (gen_page - 1) * 12;
/* 実際に表示する件数 */
/* 1ページしかない、もしくは最終ページなら調整 */
if( gen_page == zen_page ) {
if( zen_page >= 2 ) {
lpcnt = kensuu - ((zen_page-1)*12);
} else {
lpcnt = kensuu;
}
} else {
lpcnt = 12;
}
/* 初期化 */
for( i1=0; i1<=11; i1++ ) {
page_todou[i1][0] = '\0';
page_kugun[i1][0] = '\0';
page_tyouson[i1][0] = '\0';
page_azamei[i1][0] = '\0';
page_yomi0[i1][0] = '\0';
page_yomi1[i1][0] = '\0';
page_yomi2[i1][0] = '\0';
page_yomi3[i1][0] = '\0';
pnum[i1][0] = '\0';
}
/* データを取ってくる */
for( i1=0; i1<=lpcnt-1; i1++ ) {
aza_sw = 0;
ki = kijun + i1;
ofs = point[ ki ] + 1;
bdelim = joukyou[ ki ]; /* デリミタセット */
/* case で処理しないのには理由があるので注意 */
if( bdelim == '%' ) { /* 字名 */
/* 字名を得る */
get_next_han( page_azamei[i1] );
/* 50 字で打ち切り */
if( strlen( page_azamei[i1] ) >= 48 ) {
page_azamei[i1][48]='\0';
strcat( page_azamei[i1], "〈略〉" );
}
get_next_han2( page_yomi3[i1] ); /* 読み */
if( buf[ofs] != '*' ) {
//printf("例外!!!\n");
pass_next_han2( '*' );
}
ofs++;
get_next_num( numwork );
number_seikei( numwork );
strcpy( pnum[i1], " " );
strcat( pnum[i1], numwork );
ofs++;
get_next_num( pknum[i1] );
aza_sw = 1;
/* 市区郡町村(市内区も)デリミタに */
/* ぶつかるまで、バックトレース */
/* 得られたデリミタは、bdelim へ */
bdelim = backtrace();
}
if( bdelim == '!' ) { /* 市名 */
/* 市名を得る */
get_next_han( page_kugun[i1] );
strcat( page_kugun[i1], "市" );
get_next_han2( page_yomi1[i1] );
if( !aza_sw ) { /* 字名が得られていない */
/* 政令指定都市であれば */
if( seirei_check( page_kugun[i1] ) != -1 ) {
/* 市内区が unknown である */
shitei_ku_unkn = 1;
}
}
/* 県へ戻る準備 */
pass_back_han( ' ' );
bdelim = ' ';
}
if( bdelim == '\"' ) { /* 特別区 */
/* 区名を得る */
get_next_han( page_kugun[i1] );
strcat( page_kugun[i1], "区" );
get_next_han2( page_yomi1[i1] );
/* 特別区は東京都に決まっているのだけど */
pass_back_han( ' ' );
bdelim = ' ';
}
if( bdelim == '$' ) { /* 市内区 */
/* 市内区名を得る */
get_next_han( page_tyouson[i1] );
strcat( page_tyouson[i1], "区" );
get_next_han2( page_yomi2[i1] );
/* 直前の市名を得る */
pass_back_han( '!' );
get_next_han( page_kugun[i1] );
strcat( page_kugun[i1], "市" );
get_next_han2( page_yomi1[i1] );
/* 県へ戻る準備 */
pass_back_han( ' ' );
bdelim = ' ';
}
if( bdelim == ':' ) { /* 町名 */
/* 町名を得る */
get_next_han( page_tyouson[i1] );
strcat( page_tyouson[i1], "町" );
get_next_han2( page_yomi2[i1] );
ichien_check( pnum[i1], pknum[i1] );
/* 郡へ戻る準備 */
pass_back_han( '#' );
bdelim = '#';
}
if( bdelim == ';' ) { /* 村名 */
/* 町名を得る */
get_next_han( page_tyouson[i1] );
strcat( page_tyouson[i1], "村" );
get_next_han2( page_yomi2[i1] );
ichien_check( pnum[i1], pknum[i1] );
/* 郡へ戻る準備 */
pass_back_han( '#' );
bdelim = '#';
}
if( bdelim == '#' ) { /* 郡名 */
/* 郡名を得る */
get_next_han( page_kugun[i1] );
strcat( page_kugun[i1], "郡" );
get_next_han2( page_yomi1[i1] );
/* 島しょなら、ヌルね */
if( strcmp( page_kugun[i1], "島しょ郡" ) == 0 ) {
strcpy( page_kugun[i1], "" );
strcpy( page_yomi1[i1], "" );
}
/* 県へ戻る準備 */
pass_back_han( ' ' );
bdelim = ' ';
}
if( bdelim == ' ' ) { /* 県名 */
/* 県名を得る */
get_next_han( page_todou[i1] );
get_next_han2( page_yomi0[i1] );
} else {
printf("異常 601 : 独自検索で県名を突破した\n");
printf("point[ki]=|%d|\n",point[ki]);
printf("joukyou[ki]=|%c|\n",joukyou[ki]);
printf("page_todou[i1]=|%s|\n",page_todou[i1]);
printf("page_kugun[i1]=|%s|\n",page_kugun[i1]);
printf("page_tyouson[i1]=|%s|\n",page_tyouson[i1]);
printf("page_azamei[i1]=|%s|\n",page_azamei[i1]);
printf("bdelim=|%c|\n",bdelim);
for(i1=0; i1<=19; i1++ ) {
printf("%c",buf[ctr+i1]);
}
printf("\n");
return;
}
printf("%4d: ", ki+1 ); /* 件数表示 */
if( shitei_ku_unkn && joukyou[ki] == '!' ) {
printf("指定都市名");
} else {
switch( joukyou[ki] ) {
case ' ':
printf("都道府県名");
break;
case '#':
printf("郡名\t");
break;
case '!':
printf("市名\t");
break;
case ':':
printf("町名\t");
break;
case ';':
printf("村名\t");
break;
case '\"':
printf("特別区名\t");
break;
case '$':
printf("市内区名\t");
break;
case '%':
printf("字名\t");
break;
default:
printf("\t\t");
break;
}
}
/* 桁揃え */
keta( page_todou[i1], page_yomi0[i1] );
keta( page_kugun[i1], page_yomi1[i1] );
keta( page_tyouson[i1], page_yomi2[i1] );
keta( page_azamei[i1], page_yomi3[i1] );
/* 読みの表示 */
printf(" ");
kugiri();
if( joukyou[ki] == ' ' ) { /* 県からなら */
moji_pr( page_yomi0[i1], input_str );
} else {
printf("%s",page_yomi0[i1]);
}
kugiri();
if( page_yomi1[i1][0] != '\0' ) {
if( joukyou[ki] == '!' ||
joukyou[ki] == '#' ||
joukyou[ki] == '\"' ) {
moji_pr( page_yomi1[i1], input_str );
} else {
printf("%s", page_yomi1[i1] );
}
kugiri();
}
if( page_yomi2[i1][0] != '\0' ) {
if( joukyou[ki] == ':' ||
joukyou[ki] == ';' ||
joukyou[ki] == '$' ) {
moji_pr( page_yomi2[i1], input_str );
} else {
printf("%s", page_yomi2[i1] );
}
kugiri();
}
if( page_yomi3[i1][0] != '\0' ) {
if( joukyou[ki] == '%' ) {
moji_pr( page_yomi3[i1], input_str );
} else {
printf("%s", page_yomi3[i1] );
}
kugiri();
}
puts("");
/* 次の行 */
if( pnum[i1][0] != '\0' ) { /* 番号が分かっていれば */
if( k_suppress ) {
printf("\t");
} else {
k_num_disp( pknum[i1] );
}
printf("%s", pnum[i1] ); /* 郵便番号表示 */
} else {
printf("\t\t ");
}
kugiri();
/* 地名の表示 */
printf("%s",page_todou[i1]);
kugiri();
if( page_kugun[i1][0] != '\0' ) {
printf("%s",page_kugun[i1]);
kugiri();
}
if( page_tyouson[i1][0] != '\0' ) {
printf("%s",page_tyouson[i1]);
kugiri();
}
if( page_azamei[i1][0] != '\0' ) {
printf("%s",page_azamei[i1]);
kugiri();
}
if( pnum[i1][0] == '*' ) {
printf("(全域)");
}
puts("");
}
/* キー入力 */
puts("");
printf("地名選択:番号");
printf(" 字名切替:a 旧番号切替:k 区切:d 厳密検索:g\n");
if( gen_page != zen_page ) { /* 最終ページなら*/
printf("次ページ:n "); /* 「次ページ」を表示しない */
}
if( gen_page != 1 ) { /* 1ページ目なら */
printf("前ページ:b "); /* 「前ページ」を表示しない */
}
printf("次検索:p 終了:q or e\n");
inpp.max = 64;
inpp.length = 64;
lp = 1;
do{
fep_off();
_dos_gets( &inpp );
strcpy( numbuff, inpp.buffer );
if( numbuff[0] == 'q' || numbuff[0] == 'Q' ||
numbuff[0] == 'e' || numbuff[0] == 'E' ) {
puts("");
exit( 0 );
} else if( numbuff[0] == 'k' || numbuff[0] == 'K' ) {
/* 旧番号モードトグル */
if( k_suppress ) {
k_suppress = 0;
} else {
k_suppress = 1;
}
break;
} else if( numbuff[0] == 'a' || numbuff[0] == 'A' ) {
/* 字名モードトグル */
if( azamei_gentei ) {
azamei_gentei = 0;
} else {
azamei_gentei = 1;
}
break;
} else if( numbuff[0] == 'd' || numbuff[0] == 'D' ) {
/* 区切りモードトグル */
if( kugiri_mode ) {
kugiri_mode = 0;
} else {
kugiri_mode = 1;
}
break;
} else if( numbuff[0] == 'g' || numbuff[0] == 'G' ) {
/* 区切りモードトグル */
if( genmitsu_mode ) {
genmitsu_mode = 0;
} else {
genmitsu_mode = 1;
}
break;
} else if( numbuff[0] == 'n' || numbuff[0] == 'N' ||
numbuff[0] == '\0' ) {
/* 次のページへ */
if( gen_page != zen_page ) {
gen_page++;
break;
}
} else if( numbuff[0] == 'b' || numbuff[0] == 'B' ) {
/* 前のページへ */
if( gen_page != 1 ) {
gen_page--;
break;
}
} else if( numbuff[0] == 'p' || numbuff[0] == 'P' ) {
/* 次検索へ */
dokuji_sw = 1;
return;
}
/* 漢字かカナが入力された? */
if( ismbblead( numbuff[0] ) || /* 1文字はダメよ */
( ismbbkana( numbuff[0] ) && strlen( numbuff ) >= 2 ) ) {
dokuji_sw = 1;
exist_moji = 1;
strcpy( input_str, numbuff );
return;
}
/* 番号が合っているなら終わり */
s_num = atoi( numbuff );
if( s_num >= kijun+1 && s_num <= kijun+lpcnt ) {
mainlp = 0;
break;
}
/* 合っていないなら、郵便番号か? */
if( is_bangou_legal( numbuff ) ) { /* 番号なら */
dokuji_sw = 1;
exist_moji = 1;
strcpy( input_str, numbuff ); /* 番号として検索 */
return;
}
} while ( lp );
} while( mainlp );
puts("");
/* 選択された */
lpcnt = s_num % 12 - 1; /* ページ中何番が選択されたか? */
if( lpcnt == -1 ) {
lpcnt = 11;
}
s_num--; /* 0 オリジンなので */
//printf("s_num=|%d|, joukyou[s_num]=|%c|, point[s_num]=|%d|\n",s_num,joukyou[s_num],point[s_num]);
/* joukyou によって処理分けする */
if( joukyou[s_num] == ' ' || joukyou[s_num] == '#' ) {
printf("警告 603 : この候補は、まだ検索できません。\n");
dokuji_sw = 0;
// ofs = point[ s_num ];
// todou_kensaku( page_todou[lpcnt], ofs );
} else {
_dos_c_cls_al();
/* 解析結果の表示 */
printf("\t %s", page_yomi0[lpcnt] ); /* 読みがなの表示 */
if( page_yomi1[lpcnt][0] != '\0' ) {
kugiri();
printf("%s", page_yomi1[lpcnt] );
}
if( page_yomi2[lpcnt][0] != '\0' ) {
kugiri();
printf("%s", page_yomi2[lpcnt] );
}
kugiri();
printf("\n");
printf("解析結果 : %s", page_todou[lpcnt] );
kugiri();
if( page_kugun[lpcnt][0] != '\0' ) {
printf("%s", page_kugun[lpcnt] );
kugiri();
}
if( page_tyouson[lpcnt][0] != '\0' ) {
printf("%s", page_tyouson[lpcnt] );
kugiri();
}
printf("\n\n");
/* 1件しかないね? */
if( pnum[lpcnt][0] == '*' ) {
printf("%s%s", page_todou[lpcnt], page_kugun[lpcnt] );
if( page_tyouson[lpcnt][0] != '\0' ) {
moji_pr( page_tyouson[lpcnt], input_str );
}
printf("内の郵便番号はすべて %s ", &pnum[lpcnt][1] );
if( !k_suppress ) {
k_num_disp( pknum[lpcnt] );
}
printf(" です。\n");
} else {
if( !k_suppress ) {
k_num_disp( pknum[lpcnt] );
}
printf("%s", &pnum[lpcnt][1] ); /* 頭は表示しない */
printf(": ");
moji_pr( page_azamei[lpcnt], input_str );
printf("(%s)\n", page_yomi3[lpcnt] );
}
dokuji_sw = 1;
}
} else { /* kensuu は 0 、つまりヒットしなかった */
printf("警告 602 : 入力された地名 %s は見つかりませんでした。", input_str );
}
return;
}